#pragma once

#include <memory>
#include <stdexcept>
#include "jvm_stack.h" // 引入Stack类
#include "rtda/heap/method.h"

namespace jvm {
namespace rtda {

class Frame; // 前向声明Frame类
class JvmStack; // 前向声明JvmStack类

class Thread : public std::enable_shared_from_this<Thread> {
public:
    Thread(const size_t& st_size = 1024) : _pc(-1), _p_stack(std::make_shared<JvmStack>(st_size)) {}
    Thread(const Thread&) = delete; // 禁止拷贝构造
    Thread& operator=(const Thread&) = delete; // 禁止赋值操作
    Thread(Thread&&) = default; // 允许移动构造
    Thread& operator=(Thread&&) = default; // 允许移动赋值
    ~Thread() = default;

    int getPC() const;
    void setPC(int pc);

    std::shared_ptr<JvmStack> getStack() const;

    void pushFrame(std::shared_ptr<Frame> frame);
    std::shared_ptr<Frame> popFrame();

    std::shared_ptr<Frame> currentFrame() const;
    std::shared_ptr<Frame> topFrame() const;

    std::shared_ptr<Frame> newFrame(std::shared_ptr<heap::Method> pmethod);

    // bool isAlive() const { return true; } // Placeholder for actual implementation

    bool isStackEmpty() const;

    void clearStack();

    // 0是栈顶的位置
    std::shared_ptr<Frame> getFrameUnderTop(const uint32_t& dpos) const;

    std::list<std::shared_ptr<Frame>> getFrames();
private:
    int _pc;
    std::shared_ptr<JvmStack> _p_stack;
};

} // namespace rtda
} // namespace jvm